home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
parallax
/
ibm_pc_d.exe
/
SAMPLES
/
MATRIX.P
< prev
next >
Wrap
Text File
|
1992-11-06
|
1KB
|
60 lines
SYSTEM systolic_array;
(* compute the matrix product "c := a * b" *)
CONST max = 10;
TYPE matrix = ARRAY [1..max],[1..max] OF REAL;
CONFIGURATION grid [max],[max];
CONNECTION left: grid[i,j] -> grid[i,(j-1) MOD max].left;
up: grid[i,j] -> grid[(i-1) MOD max,j].up;
shiftA: grid[i,j] -> grid[i,(j-i) MOD max].shiftA;
shiftB: grid[i,j] -> grid[(i-j) MOD max,j].shiftB;
SCALAR i,j : INTEGER;
a,b,c : matrix;
PROCEDURE matrix_mult(SCALAR VAR a,b,c : matrix);
(* c := a * b *)
SCALAR k: INTEGER;
VECTOR ra,rb,rc : REAL;
BEGIN
LOAD (ra,a);
LOAD (rb,b);
PARALLEL
PROPAGATE.shiftA(ra);
PROPAGATE.shiftB(rb);
rc := ra * rb;
FOR k := 2 TO max DO
PROPAGATE.left(ra);
PROPAGATE.up(rb);
rc := rc + ra * rb;
END;
ENDPARALLEL;
STORE(rc,c);
END matrix_mult;
PROCEDURE out(SCALAR VAR a: matrix);
SCALAR i,j: CARDINAL;
BEGIN
FOR i:=1 TO max DO
FOR j:=1 TO max DO WriteFixPt(a[i,j], 10,2) END;
WriteLn
END;
WriteLn
END out;
BEGIN
(* preset input matrices "a" and "b" (or read them from a file instead) *)
FOR i:=1 TO max DO
FOR j:=1 TO max DO
a[i,j]:=FLOAT(10*i+j);
b[i,j]:=FLOAT(i+j);
END;
END;
out(a); out(b);
matrix_mult(a,b,c);
out(c); (* print result matrix "c" *)
END systolic_array.